<?php
/**
 * Memcached Cache Plugin
 */

/// 类定义开始
class CacheMm {

	private $mm=null;

	/**
     * 构造函数
     *
     * @access public
     */
    public function __construct() {
    	// do nothing.
    }

    public function __destruct() {

    	$this->_disconnect();
    }

    /**
     * 连接
     */
    public function connect($hosts) {
    	/// do nothing.
    }

    /**
     * 连接
     */
    public function _connect($hosts) {

    	$this->mm = new Memcache();

    	foreach ($hosts as $k=>$v) {
    		$this->mm->addServer($v['host'], $v['port'], false);
    	}

    	return;
    }

    /**
     * 断开连接
     */
    public function _disconnect() {

    	$this->mm->close();
    }

    /**
     * 得到一个缓存值
     *
     * @param array hosts
     * @param string key
     * @param boolean retry, 是否要支持故障转移，默认是支持的
     */
    public function get($hosts, $key, $retry=1) {

    	$this->_connect($hosts);

    	$ret = $this->mm->get($key);

    	$this->_disconnect();

    	return $ret;
    }

    /**
     * 设置一个缓存
     *
     * @param string app, app_name
     * @param string cache_class 缓存分类名
     * @param boolean remote, 是否是远程push过来的，远程push过来的不做同步
     * @param array hosts
     * @param string key
     * @param string value
     * @param int timeout, 过期时间，默认0(永不过期)
     * @param boolean retry, 是否要支持故障转移，默认是支持的
     */
    public function set($app, $cache_class, $remote, $hosts, $key, $value, $timeout=0, $retry=1, $version='') {

    	$this->_connect($hosts);

    	$ret = $this->mm->set($key, $value, 0, $timeout);

    	$this->_disconnect();

    	/// push同IDC同步队列
//    	if (!$remote) {
//    		$this->pushIdcQueue($app, 'set', $cache_class, $key, $value, $version);
//    	}

    	return $ret;
    }

    /**
     * 删除一个缓存
     *
     * @param string app, app_name
     * @param string cache_class 缓存分类名
     * @param boolean remote, 是否是远程push过来的，远程push过来的不做同步
     * @param array hosts
     * @param string key
     * @param boolean retry, 是否要支持故障转移，默认是不支持的，因为没必要
     */
    public function delete($app, $cache_class, $remote, $hosts, $key, $retry=0, $version='') {

    	$this->_connect($hosts);

    	$ret = $this->mm->delete($key);

    	$this->_disconnect();

    	/// push同IDC同步队列
//    	if (!$remote) {
//    		$this->pushIdcQueue($app, 'delete', $cache_class, $key, '', $version);
//    	}

    	return $ret;
    }

    /**
     * 清空缓存
     *
     * 本函数会削去使用的内存空间
     *
     * 不推荐使用，如果需要使用，请使用后台缓存管理
     *
     * 会清除cache_class所在缓存服务器的所有缓存，慎重！慎重！慎重！
     */
    public function clear() {

    	return true;
//    	return $this->mm->flush();
    }

    /**
     * 把所有缓存操作的动作 set/delete 同时添加到队列
     *
     * @param string app, 本次缓存操作所属app_name
     * @param string op, set/delete
     * @param string cache_class 缓存分类名
     * @param string key
     * @param string value
     */
    public function pushIdcQueue($app, $op, $cache_class, $key, $value='', $version='') {

    	$tmp = $cache_class;
    	if (strlen($version) > 0) {
    		$tmp .= '-'.$version;
    	}

    	$key = preg_replace('/^'.$app.'-'.$tmp.'-/si', '', $key);

    	$queue_data = array(
    		'app'         => $app,
    		'op'          => $op,
    		'cache_class' => $cache_class,
    		'key'         => $key,
    		'value'       => $value,
    	);


    	if ($app == 'r') {
    		$local_qconf = get_idc_lq(IDC_QUEUE.'_r');
    		$queue = new Queue(SYSTEM_APP, IDC_QUEUE.'_r', $local_qconf);

    	} else {
	    	$local_qconf = get_idc_lq();
	    	$queue = new Queue(SYSTEM_APP, IDC_QUEUE, $local_qconf);
    	}
    	$queue_data = json_encode($queue_data);

		try {
			$ret = $queue->put($queue_data);

			if ($ret === true) return true;

			return false;
		}
		catch (Exception $ex) {

			/// 这里可能需要进行log记录
			/// @todo

			return false;
		}
    }
}